package com.xc.tool.utils;


import java.io.*;
import java.util.Optional;
import java.util.Properties;

/**
 * <p>项目名称: Stars</p>
 * <p>描述: properties文件读取</p>
 * <P>创建人: 小程</p>
 * <P>创建人邮箱: 779943476@qq.com</p>
 * <p>创建时间: 2019/7/18</p>
 *
 * @version v1.0
 */
public class PropertiesUtils {

    /**
     * properties配置对象
     */
    private static Properties props;

    /**
     * <p>功能描述:初始化properties配置文件</p>
     * <p>更新人: 小程</p>
     * <p>更新描述: 添加方法</p>
     * <p>更新人邮箱: 779943476@qq.com</p>
     * <p>更新时间: 2019/7/1</p>
     *
     * @param configFile 文件地址，支持classPath和file
     */
    public synchronized static void initProperties(String configFile) {
        props = new Properties();
        InputStream in = null;
        try {
            if (configFile == null || "".equals(configFile)) {
                configFile = "classPath:application.properties";
            }
            String[] classpaths = configFile.toLowerCase().split("classpath:");
            String[] files = configFile.toLowerCase().split("file:");
            String path = PropertiesUtils.class.getResource("/").getPath();
            if (classpaths.length > 1) {
                //第一种，通过类加载器进行获取properties文件流
                File file = new File(path + classpaths[1]);
                in = new FileInputStream(file);
            } else if (files.length > 1) {
                File file = new File(files[1]);
                in = new FileInputStream(file);
            } else {
                File file = new File(path + configFile);
                in = new FileInputStream(file);
            }
            //第二种，通过类进行获取properties文件流
            if (Optional.ofNullable(in).isPresent()) {
                props.load(in);
            } else {
                throw new FileNotFoundException();
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (Optional.ofNullable(in).isPresent()) {
                    in.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * <p>功能描述:获取properties的配置,必须先初始化</p>
     * <p>更新人: 小程</p>
     * <p>更新描述: 添加方法</p>
     * <p>更新人邮箱: 779943476@qq.com</p>
     * <p>更新时间: 2019/7/1</p>
     *
     * @param key 配置key
     * @return 配置值
     */
    public static String getProperty(String key) {
        if (!Optional.ofNullable(props).isPresent()) {
            throw new NullPointerException("Properties还未初始化！");
        }
        return props.getProperty(key);
    }

    /**
     * <p>功能描述:获取properties的配置,可配置默认值，必须先初始化</p>
     * <p>更新人: 小程</p>
     * <p>更新描述: 添加方法</p>
     * <p>更新人邮箱: 779943476@qq.com</p>
     * <p>更新时间: 2019/7/1</p>
     *
     * @param key          配置key
     * @param defaultValue 默认值
     * @return 配置值
     */
    public static String getProperty(String key, String defaultValue) throws Exception {
        if (!Optional.ofNullable(props).isPresent()) {
            throw new NullPointerException("Properties还未初始化！");
        }
        return props.getProperty(key, defaultValue);
    }
}
